﻿using System.Configuration;
using System.Data.SqlClient;
using Vra.DataAccess.Exceptions;

namespace Vra.DataAccess
{
	/// <summary>
	/// Реализация базовой логики для всех объектов для доступа к данным
	/// </summary>
	internal class BaseDao : IBaseDao
	{
		/// <summary>
		/// Название параметра в строках подключения
		/// </summary>
		private const string ConnectinStringName = "DbConnection";

		/// <summary>
		/// Тут хранится строка подключения
		/// </summary>
		private static string _connectionString;

		/// <summary>
		/// Создает новый экземпляр <seealso cref="BaseDao"/>
		/// </summary>
		protected BaseDao()
		{
			try
			{
				_connectionString = ConfigurationManager.ConnectionStrings[ConnectinStringName].ConnectionString;
			}
			catch(ConfigurationErrorsException) {}
		}

		/// <summary>
		/// Задает новые параметры для строки подключения
		/// </summary>
		/// <param name="server">сервер</param>
		/// <param name="dbname">база данных</param>
		/// <param name="user">имя пользователя</param>
		/// <param name="pass">пароль</param>
		public static void SetConnectionString(string server, string dbname, string user, string pass)
		{
			SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
			builder.DataSource = user;
			builder.Password = pass;
			builder.InitialCatalog = dbname;
			_connectionString = builder.ConnectionString;
		}

		/// <summary>
		/// Возвращает объект подключения к базе
		/// </summary>
		/// <returns></returns>
		protected SqlConnection GetConnection()
		{
			if (!HasConnectionString)
				throw new ConnectionStringEmptyException();
			return new SqlConnection(_connectionString);
		}

		/// <summary>
		/// Возвращает факт наличия строки подключения
		/// </summary>
		public static bool HasConnectionString
		{
			get { return !string.IsNullOrEmpty(_connectionString); }
		}
	}
}
